crystalai's picture
Upload 37 files
679ee5f verified
RnJvbSAxOTYyZDkzMTUzNWI0MmVlYmZkOTliMTdlZWI3ZDRlZWRhZGE2OGIxIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLZW4gUm9ja290IDxyb2Nrb3RAZ29vZ2xlLmNvbT4KRGF0ZTogV2VkLCAyMSBBdWcgMjAxOSAwMTo0NzoyOCArMDAwMApTdWJqZWN0OiBbUEFUQ0hdIEludHJvZHVjZSB0aGUgU3RvcmFnZSBTZXJ2aWNlCgpUaGlzIGxheXMgZ3JvdW5kd29yayBmb3IgdGhlIG5ldyBTdG9yYWdlIFNlcnZpY2UgY29tcG9uZW50LCB3aGljaCB3aWxsCmJlIHVzZWQgdG8gc3VwcG9ydCBzZWN1cml0eSBhbmQgcGVyZm9ybWFuY2UgaXNvbGF0aW9uIG9mIHdlYiBzdG9yYWdlIEFQSQpiYWNrZW5kcyBhcyB3ZWxsIGFzIHRvIHBvdGVudGlhbGx5IHN1cHBvcnQgdXNhZ2Ugb2YgdGhlIHN0b3JhZ2UgYmFja2VuZHMKaW4gQ2xhbmsncyByZWR1Y2VkLW1vZGUgYnJvd3Nlci4KClRoaXMgQ0wgaW50cm9kdWNlcyBiYXNpYyBjb25jZXB0cyBvZiBTdG9yYWdlU2VydmljZSwgUGFydGl0aW9uLCBhbmQKT3JpZ2luQ29udGV4dCBhcyBhIG1vZGVsIGZvciBjbGllbnRzIHRvIGNsZWFubHkgaXNvbGF0ZSBhY2Nlc3MgdG8gc2NvcGVkCnN0b3JhZ2UgY29udGV4dHMuIEJhc2ljIHVuaXQgdGVzdHMgYXJlIGFkZGVkIHRvIHZhbGlkYXRlIGludGVuZGVkIHNjb3BpbmcKYmVoYXZpb3IuCgpDaGFuZ2UtSWQ6IEkyMmIwYjRmYmUzMmMwYjE3YjFlYmQ4NzIzNzU1Yzk0ZjE2OTk3MzU5CkJ1ZzogOTk0OTExClJldmlld2VkLW9uOiBodHRwczovL2Nocm9taXVtLXJldmlldy5nb29nbGVzb3VyY2UuY29tL2MvY2hyb21pdW0vc3JjLysvMTc1ODk2NQpSZXZpZXdlZC1ieTogQ2hyaXMgUGFsbWVyIDxwYWxtZXJAY2hyb21pdW0ub3JnPgpSZXZpZXdlZC1ieTogVmljdG9yIENvc3RhbiA8cHduYWxsQGNocm9taXVtLm9yZz4KQ29tbWl0LVF1ZXVlOiBLZW4gUm9ja290IDxyb2Nrb3RAZ29vZ2xlLmNvbT4KQ3ItQ29tbWl0LVBvc2l0aW9uOiByZWZzL2hlYWRzL21hc3RlckB7IzY4ODgzOH0KLS0tCgpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9CVUlMRC5nbiBiL2NvbXBvbmVudHMvQlVJTEQuZ24KaW5kZXggNTQ4MGNlMzguLjMzNzczZDEgMTAwNjQ0Ci0tLSBhL2NvbXBvbmVudHMvQlVJTEQuZ24KKysrIGIvY29tcG9uZW50cy9CVUlMRC5nbgpAQCAtMTM2LDYgKzEzNiw3IEBACiAgICAgIi8vY29tcG9uZW50cy9zZWN1cml0eV9zdGF0ZS9jb3JlOnVuaXRfdGVzdHMiLAogICAgICIvL2NvbXBvbmVudHMvc2VuZF90YWJfdG9fc2VsZjp1bml0X3Rlc3RzIiwKICAgICAiLy9jb21wb25lbnRzL3NlcnZpY2VzL2hlYXBfcHJvZmlsaW5nL3B1YmxpYy9jcHA6dW5pdF90ZXN0cyIsCisgICAgIi8vY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlOnRlc3RzIiwKICAgICAiLy9jb21wb25lbnRzL3NlcnZpY2VzL3VuemlwOnVuaXRfdGVzdHMiLAogICAgICIvL2NvbXBvbmVudHMvc2Vzc2lvbnM6dW5pdF90ZXN0cyIsCiAgICAgIi8vY29tcG9uZW50cy9zaWduaW4vY29yZS9icm93c2VyOnVuaXRfdGVzdHMiLApkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL0JVSUxELmduIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL0JVSUxELmduCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWMzMjA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL0JVSUxELmduCkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworc291cmNlX3NldCgic3RvcmFnZSIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAib3JpZ2luX2NvbnRleHRfaW1wbC5jYyIsCisgICAgIm9yaWdpbl9jb250ZXh0X2ltcGwuaCIsCisgICAgInBhcnRpdGlvbl9pbXBsLmNjIiwKKyAgICAicGFydGl0aW9uX2ltcGwuaCIsCisgICAgInN0b3JhZ2Vfc2VydmljZV9pbXBsLmNjIiwKKyAgICAic3RvcmFnZV9zZXJ2aWNlX2ltcGwuaCIsCisgIF0KKworICBwdWJsaWNfZGVwcyA9IFsKKyAgICAiLy9iYXNlIiwKKyAgICAiLy9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tIiwKKyAgICAiLy9tb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MiLAorICAgICIvL3VybCIsCisgIF0KK30KKworc291cmNlX3NldCgidGVzdHMiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorCisgIHNvdXJjZXMgPSBbCisgICAgInBhcnRpdGlvbl9pbXBsX3VuaXR0ZXN0LmNjIiwKKyAgICAic3RvcmFnZV9zZXJ2aWNlX2ltcGxfdW5pdHRlc3QuY2MiLAorICBdCisKKyAgZGVwcyA9IFsKKyAgICAiOnN0b3JhZ2UiLAorICAgICIvL2Jhc2UiLAorICAgICIvL2Jhc2UvdGVzdDp0ZXN0X3N1cHBvcnQiLAorICAgICIvL3Rlc3RpbmcvZ3Rlc3QiLAorICBdCit9CmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvT1dORVJTIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIwMGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2phbUBjaHJvbWl1bS5vcmcKK3B3bmFsbEBjaHJvbWl1bS5vcmcKK3JvY2tvdEBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvb3JpZ2luX2NvbnRleHRfaW1wbC5jYyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9vcmlnaW5fY29udGV4dF9pbXBsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTM3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvb3JpZ2luX2NvbnRleHRfaW1wbC5jYwpAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvb3JpZ2luX2NvbnRleHRfaW1wbC5oIgorCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmgiCisKK25hbWVzcGFjZSBzdG9yYWdlIHsKKworT3JpZ2luQ29udGV4dEltcGw6Ok9yaWdpbkNvbnRleHRJbXBsKFBhcnRpdGlvbkltcGwqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmw6Ok9yaWdpbiYgb3JpZ2luKQorICAgIDogcGFydGl0aW9uXyhwYXJ0aXRpb24pLCBvcmlnaW5fKG9yaWdpbikgeworICByZWNlaXZlcnNfLnNldF9kaXNjb25uZWN0X2hhbmRsZXIoYmFzZTo6QmluZFJlcGVhdGluZygKKyAgICAgICZPcmlnaW5Db250ZXh0SW1wbDo6T25EaXNjb25uZWN0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSk7Cit9CisKK09yaWdpbkNvbnRleHRJbXBsOjp+T3JpZ2luQ29udGV4dEltcGwoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgT3JpZ2luQ29udGV4dEltcGw6OkJpbmRSZWNlaXZlcigKKyAgICBtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206Ok9yaWdpbkNvbnRleHQ+IHJlY2VpdmVyKSB7CisgIHJlY2VpdmVyc18uQWRkKHRoaXMsIHN0ZDo6bW92ZShyZWNlaXZlcikpOworfQorCit2b2lkIE9yaWdpbkNvbnRleHRJbXBsOjpPbkRpc2Nvbm5lY3QoKSB7CisgIGlmIChyZWNlaXZlcnNfLmVtcHR5KCkpIHsKKyAgICAvLyBEZWxldGVzIHx0aGlzfC4KKyAgICBwYXJ0aXRpb25fLT5SZW1vdmVPcmlnaW5Db250ZXh0KG9yaWdpbl8pOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvb3JpZ2luX2NvbnRleHRfaW1wbC5oIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL29yaWdpbl9jb250ZXh0X2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQxMzExCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL29yaWdpbl9jb250ZXh0X2ltcGwuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ09NUE9ORU5UU19TRVJWSUNFU19TVE9SQUdFX09SSUdJTl9DT05URVhUX0lNUExfSF8KKyNkZWZpbmUgQ09NUE9ORU5UU19TRVJWSUNFU19TVE9SQUdFX09SSUdJTl9DT05URVhUX0lNUExfSF8KKworI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9vcmlnaW5fY29udGV4dC5tb2pvbS5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9wZW5kaW5nX3JlY2VpdmVyLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3JlY2VpdmVyX3NldC5oIgorI2luY2x1ZGUgInVybC9vcmlnaW4uaCIKKworbmFtZXNwYWNlIHN0b3JhZ2UgeworCitjbGFzcyBQYXJ0aXRpb25JbXBsOworCitjbGFzcyBPcmlnaW5Db250ZXh0SW1wbCA6IHB1YmxpYyBtb2pvbTo6T3JpZ2luQ29udGV4dCB7CisgcHVibGljOgorICBPcmlnaW5Db250ZXh0SW1wbChQYXJ0aXRpb25JbXBsKiBwYXJ0aXRpb24sIGNvbnN0IHVybDo6T3JpZ2luJiBvcmlnaW4pOworICB+T3JpZ2luQ29udGV4dEltcGwoKSBvdmVycmlkZTsKKworICBjb25zdCBtb2pvOjpSZWNlaXZlclNldDxtb2pvbTo6T3JpZ2luQ29udGV4dD4mIHJlY2VpdmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVjZWl2ZXJzXzsKKyAgfQorCisgIHZvaWQgQmluZFJlY2VpdmVyKG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6T3JpZ2luQ29udGV4dD4gcmVjZWl2ZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBPbkRpc2Nvbm5lY3QoKTsKKworICBQYXJ0aXRpb25JbXBsKiBjb25zdCBwYXJ0aXRpb25fOworICBjb25zdCB1cmw6Ok9yaWdpbiBvcmlnaW5fOworICBtb2pvOjpSZWNlaXZlclNldDxtb2pvbTo6T3JpZ2luQ29udGV4dD4gcmVjZWl2ZXJzXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oT3JpZ2luQ29udGV4dEltcGwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKKworI2VuZGlmICAvLyBDT01QT05FTlRTX1NFUlZJQ0VTX1NUT1JBR0VfT1JJR0lOX0NPTlRFWFRfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmNjIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTc5MTJkCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmNjCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbC5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJhc2UvYmluZC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5oIgorCituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK1BhcnRpdGlvbkltcGw6OlBhcnRpdGlvbkltcGwoU3RvcmFnZVNlcnZpY2VJbXBsKiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpPcHRpb25hbDxiYXNlOjpGaWxlUGF0aD4mIHBhdGgpCisgICAgOiBzZXJ2aWNlXyhzZXJ2aWNlKSwgcGF0aF8ocGF0aCkgeworICByZWNlaXZlcnNfLnNldF9kaXNjb25uZWN0X2hhbmRsZXIoYmFzZTo6QmluZFJlcGVhdGluZygKKyAgICAgICZQYXJ0aXRpb25JbXBsOjpPbkRpc2Nvbm5lY3QsIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKK30KKworUGFydGl0aW9uSW1wbDo6flBhcnRpdGlvbkltcGwoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgUGFydGl0aW9uSW1wbDo6QmluZFJlY2VpdmVyKAorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6UGFydGl0aW9uPiByZWNlaXZlcikgeworICBEQ0hFQ0socmVjZWl2ZXJzXy5lbXB0eSgpIHx8IHBhdGhfLmhhc192YWx1ZSgpKQorICAgICAgPDwgIkluLW1lbW9yeSBwYXJ0aXRpb25zIG11c3QgaGF2ZSBhdCBtb3N0IG9uZSBjbGllbnQuIjsKKworICByZWNlaXZlcnNfLkFkZCh0aGlzLCBzdGQ6Om1vdmUocmVjZWl2ZXIpKTsKK30KKwordm9pZCBQYXJ0aXRpb25JbXBsOjpCaW5kT3JpZ2luQ29udGV4dCgKKyAgICBjb25zdCB1cmw6Ok9yaWdpbiYgb3JpZ2luLAorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6T3JpZ2luQ29udGV4dD4gcmVjZWl2ZXIpIHsKKyAgYXV0byBpdGVyID0gb3JpZ2luX2NvbnRleHRzXy5maW5kKG9yaWdpbik7CisgIGlmIChpdGVyID09IG9yaWdpbl9jb250ZXh0c18uZW5kKCkpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG9yaWdpbl9jb250ZXh0c18uZW1wbGFjZSgKKyAgICAgICAgb3JpZ2luLCBzdGQ6Om1ha2VfdW5pcXVlPE9yaWdpbkNvbnRleHRJbXBsPih0aGlzLCBvcmlnaW4pKTsKKyAgICBpdGVyID0gcmVzdWx0LmZpcnN0OworICB9CisKKyAgaXRlci0+c2Vjb25kLT5CaW5kUmVjZWl2ZXIoc3RkOjptb3ZlKHJlY2VpdmVyKSk7Cit9CisKK3ZvaWQgUGFydGl0aW9uSW1wbDo6T25EaXNjb25uZWN0KCkgeworICBpZiAocmVjZWl2ZXJzXy5lbXB0eSgpKSB7CisgICAgLy8gRGVsZXRlcyB8dGhpc3wuCisgICAgc2VydmljZV8tPlJlbW92ZVBhcnRpdGlvbih0aGlzKTsKKyAgfQorfQorCit2b2lkIFBhcnRpdGlvbkltcGw6OlJlbW92ZU9yaWdpbkNvbnRleHQoY29uc3QgdXJsOjpPcmlnaW4mIG9yaWdpbikgeworICBvcmlnaW5fY29udGV4dHNfLmVyYXNlKG9yaWdpbik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcGFydGl0aW9uX2ltcGwuaCBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OWE3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcGFydGl0aW9uX2ltcGwuaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQ09NUE9ORU5UU19TRVJWSUNFU19TVE9SQUdFX1BBUlRJVElPTl9JTVBMX0hfCisjZGVmaW5lIENPTVBPTkVOVFNfU0VSVklDRVNfU1RPUkFHRV9QQVJUSVRJT05fSU1QTF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL21hY3Jvcy5oIgorI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvb3JpZ2luX2NvbnRleHRfaW1wbC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wdWJsaWMvbW9qb20vcGFydGl0aW9uLm1vam9tLmgiCisjaW5jbHVkZSAibW9qby9wdWJsaWMvY3BwL2JpbmRpbmdzL3BlbmRpbmdfcmVjZWl2ZXIuaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcmVjZWl2ZXJfc2V0LmgiCisjaW5jbHVkZSAidXJsL29yaWdpbi5oIgorCituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK2NsYXNzIFN0b3JhZ2VTZXJ2aWNlSW1wbDsKKworLy8gQSBQYXJ0aXRpb25JbXBsIGluc3RhbmNlIGV4Y2x1c2l2ZWx5IG93bnMgYW4gaXNvbGF0ZWQgc3RvcmFnZSBwYXJ0aXRpb24KKy8vIGNvcnJlc3BvbmRpbmcgdG8gZWl0aGVyIGEgcGVyc2lzdGVudCBmaWxlc3lzdGVtIGRpcmVjdG9yeSBvciBhbiBpbi1tZW1vcnkKKy8vIGRhdGFiYXNlLgorY2xhc3MgUGFydGl0aW9uSW1wbCA6IHB1YmxpYyBtb2pvbTo6UGFydGl0aW9uIHsKKyBwdWJsaWM6CisgIC8vIHxzZXJ2aWNlfCBvd25zIGFuZCBvdXRsaXZlcyB0aGlzIG9iamVjdC4KKyAgZXhwbGljaXQgUGFydGl0aW9uSW1wbChTdG9yYWdlU2VydmljZUltcGwqIHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6T3B0aW9uYWw8YmFzZTo6RmlsZVBhdGg+JiBwYXRoKTsKKyAgflBhcnRpdGlvbkltcGwoKSBvdmVycmlkZTsKKworICBjb25zdCBiYXNlOjpPcHRpb25hbDxiYXNlOjpGaWxlUGF0aD4mIHBhdGgoKSBjb25zdCB7IHJldHVybiBwYXRoXzsgfQorCisgIGNvbnN0IG1vam86OlJlY2VpdmVyU2V0PG1vam9tOjpQYXJ0aXRpb24+JiByZWNlaXZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlY2VpdmVyc187CisgIH0KKworICBjb25zdCBhdXRvJiBvcmlnaW5fY29udGV4dHMoKSBjb25zdCB7IHJldHVybiBvcmlnaW5fY29udGV4dHNfOyB9CisKKyAgLy8gQmluZHMgYSBuZXcgY2xpZW50IGVuZHBvaW50IHRvIHRoaXMgcGFydGl0aW9uLgorICB2b2lkIEJpbmRSZWNlaXZlcihtb2pvOjpQZW5kaW5nUmVjZWl2ZXI8bW9qb206OlBhcnRpdGlvbj4gcmVjZWl2ZXIpOworCisgIC8vIG1vam9tOjpQYXJ0aXRpb246CisgIHZvaWQgQmluZE9yaWdpbkNvbnRleHQoCisgICAgICBjb25zdCB1cmw6Ok9yaWdpbiYgb3JpZ2luLAorICAgICAgbW9qbzo6UGVuZGluZ1JlY2VpdmVyPG1vam9tOjpPcmlnaW5Db250ZXh0PiByZWNlaXZlcikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgT3JpZ2luQ29udGV4dEltcGw7CisKKyAgdm9pZCBPbkRpc2Nvbm5lY3QoKTsKKyAgdm9pZCBSZW1vdmVPcmlnaW5Db250ZXh0KGNvbnN0IHVybDo6T3JpZ2luJiBvcmlnaW4pOworCisgIFN0b3JhZ2VTZXJ2aWNlSW1wbCogY29uc3Qgc2VydmljZV87CisgIGNvbnN0IGJhc2U6Ok9wdGlvbmFsPGJhc2U6OkZpbGVQYXRoPiBwYXRoXzsKKyAgbW9qbzo6UmVjZWl2ZXJTZXQ8bW9qb206OlBhcnRpdGlvbj4gcmVjZWl2ZXJzXzsKKyAgc3RkOjptYXA8dXJsOjpPcmlnaW4sIHN0ZDo6dW5pcXVlX3B0cjxPcmlnaW5Db250ZXh0SW1wbD4+IG9yaWdpbl9jb250ZXh0c187CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFBhcnRpdGlvbkltcGwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0b3JhZ2UKKworI2VuZGlmICAvLyBDT01QT05FTlRTX1NFUlZJQ0VTX1NUT1JBR0VfUEFSVElUSU9OX0lNUExfSF8KZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbF91bml0dGVzdC5jYyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAxZjczOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbF91bml0dGVzdC5jYwpAQCAtMCwwICsxLDEzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Vfc2VydmljZV9pbXBsLmgiCisKKyNpbmNsdWRlICJiYXNlL2ZpbGVzL2ZpbGVfcGF0aC5oIgorI2luY2x1ZGUgImJhc2UvZmlsZXMvc2NvcGVkX3RlbXBfZGlyLmgiCisjaW5jbHVkZSAiYmFzZS9tYWNyb3MuaCIKKyNpbmNsdWRlICJiYXNlL3J1bl9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L3Njb3BlZF90YXNrX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9wYXJ0aXRpb24ubW9qb20uaCIKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL3N0b3JhZ2Vfc2VydmljZS5tb2pvbS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInVybC9ndXJsLmgiCisKK25hbWVzcGFjZSBzdG9yYWdlIHsKKworY2xhc3MgU3RvcmFnZVNlcnZpY2VQYXJ0aXRpb25JbXBsVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIFN0b3JhZ2VTZXJ2aWNlUGFydGl0aW9uSW1wbFRlc3QoKSA9IGRlZmF1bHQ7CisgIH5TdG9yYWdlU2VydmljZVBhcnRpdGlvbkltcGxUZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgcmVtb3RlX3NlcnZpY2VfLT5CaW5kUGFydGl0aW9uKAorICAgICAgICBiYXNlOjpudWxsb3B0LCByZW1vdGVfdGVzdF9wYXJ0aXRpb25fLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworICAgIHJlbW90ZV90ZXN0X3BhcnRpdGlvbl8uRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgICBBU1NFUlRfRVEoMXUsIHNlcnZpY2VfLnBhcnRpdGlvbnMoKS5zaXplKCkpOworICAgIHRlc3RfcGFydGl0aW9uX2ltcGxfID0gc2VydmljZV8ucGFydGl0aW9ucygpLmJlZ2luKCktPmdldCgpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIG1vam9tOjpQYXJ0aXRpb24qIHJlbW90ZV90ZXN0X3BhcnRpdGlvbigpIHsKKyAgICByZXR1cm4gcmVtb3RlX3Rlc3RfcGFydGl0aW9uXy5nZXQoKTsKKyAgfQorICBQYXJ0aXRpb25JbXBsKiB0ZXN0X3BhcnRpdGlvbl9pbXBsKCkgeyByZXR1cm4gdGVzdF9wYXJ0aXRpb25faW1wbF87IH0KKworIHByaXZhdGU6CisgIGJhc2U6OnRlc3Q6OlNjb3BlZFRhc2tFbnZpcm9ubWVudCB0YXNrX2Vudmlyb25tZW50XzsKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpTdG9yYWdlU2VydmljZT4gcmVtb3RlX3NlcnZpY2VfOworICBTdG9yYWdlU2VydmljZUltcGwgc2VydmljZV97cmVtb3RlX3NlcnZpY2VfLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCl9OworICBtb2pvOjpSZW1vdGU8bW9qb206OlBhcnRpdGlvbj4gcmVtb3RlX3Rlc3RfcGFydGl0aW9uXzsKKyAgUGFydGl0aW9uSW1wbCogdGVzdF9wYXJ0aXRpb25faW1wbF8gPSBudWxscHRyOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdG9yYWdlU2VydmljZVBhcnRpdGlvbkltcGxUZXN0KTsKK307CisKK1RFU1RfRihTdG9yYWdlU2VydmljZVBhcnRpdGlvbkltcGxUZXN0LCBJbmRlcGVuZGVudE9yaWdpbkNvbnRleHRzKSB7CisgIC8vIFZlcmlmaWVzIHRoYXQgY2xpZW50cyBmb3IgdW5pcXVlIG9yaWdpbnMgZ2V0IGJvdW5kIHRvIHVuaXF1ZSBPcmlnaW5Db250ZXh0CisgIC8vIGJhY2tlbmRzLgorCisgIGNvbnN0IHVybDo6T3JpZ2luIGtUZXN0T3JpZ2luMSA9CisgICAgICB1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHA6Ly9leGFtcGxlLmNvbSIpKTsKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpPcmlnaW5Db250ZXh0PiBjb250ZXh0MTsKKyAgcmVtb3RlX3Rlc3RfcGFydGl0aW9uKCktPkJpbmRPcmlnaW5Db250ZXh0KAorICAgICAga1Rlc3RPcmlnaW4xLCBjb250ZXh0MS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgY29udGV4dDEuRmx1c2hGb3JUZXN0aW5nKCk7CisgIEVYUEVDVF9FUSgxdSwgdGVzdF9wYXJ0aXRpb25faW1wbCgpLT5vcmlnaW5fY29udGV4dHMoKS5zaXplKCkpOworCisgIGNvbnN0IHVybDo6T3JpZ2luIGtUZXN0T3JpZ2luMiA9CisgICAgICB1cmw6Ok9yaWdpbjo6Q3JlYXRlKEdVUkwoImh0dHBzOi8vZ29vZ2xlLmNvbSIpKTsKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpPcmlnaW5Db250ZXh0PiBjb250ZXh0MjsKKyAgcmVtb3RlX3Rlc3RfcGFydGl0aW9uKCktPkJpbmRPcmlnaW5Db250ZXh0KAorICAgICAga1Rlc3RPcmlnaW4yLCBjb250ZXh0Mi5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgY29udGV4dDIuRmx1c2hGb3JUZXN0aW5nKCk7CisgIEVYUEVDVF9FUSgydSwgdGVzdF9wYXJ0aXRpb25faW1wbCgpLT5vcmlnaW5fY29udGV4dHMoKS5zaXplKCkpOworCisgIEVYUEVDVF9UUlVFKGNvbnRleHQxLmlzX2Nvbm5lY3RlZCgpKTsKKyAgRVhQRUNUX1RSVUUoY29udGV4dDIuaXNfY29ubmVjdGVkKCkpOworCisgIC8vIFZlcmlmeSB0aGF0IHxjb250ZXh0MXwgd2FzIGNvbm5lY3RlZCB0byB0aGUgYmFja2VuZCBmb3IgfGtUZXN0T3JpZ2luMXwgYnkKKyAgLy8gZGlzY29ubmVjdGluZyB8Y29udGV4dDF8IGFuZCB3YWl0aW5nIGZvciB0aGUgYmFja2VuZCB0byBiZSBkZXN0cm95ZWQuCisgIGNvbnRleHQxLnJlc2V0KCk7CisgIGJhc2U6OlJ1bkxvb3AoKS5SdW5VbnRpbElkbGUoKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICBiYXNlOjpDb250YWlucyh0ZXN0X3BhcnRpdGlvbl9pbXBsKCktPm9yaWdpbl9jb250ZXh0cygpLCBrVGVzdE9yaWdpbjIpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgYmFzZTo6Q29udGFpbnModGVzdF9wYXJ0aXRpb25faW1wbCgpLT5vcmlnaW5fY29udGV4dHMoKSwga1Rlc3RPcmlnaW4xKSk7CisKKyAgLy8gU2FtZSBmb3IgfGNvbnRleHQyfC4KKyAgY29udGV4dDIucmVzZXQoKTsKKyAgYmFzZTo6UnVuTG9vcCgpLlJ1blVudGlsSWRsZSgpOworICBFWFBFQ1RfRkFMU0UoCisgICAgICBiYXNlOjpDb250YWlucyh0ZXN0X3BhcnRpdGlvbl9pbXBsKCktPm9yaWdpbl9jb250ZXh0cygpLCBrVGVzdE9yaWdpbjIpKTsKK30KKworVEVTVF9GKFN0b3JhZ2VTZXJ2aWNlUGFydGl0aW9uSW1wbFRlc3QsIFNpbmdsZU9yaWdpbk11bHRpcGxlQ2xpZW50cykgeworICAvLyBWZXJpZmllcyB0aGF0IG11bHRpcGxlIGNsaWVudHMgY2FuIGJpbmQgYSBjb25uZWN0aW9uIHRvIHRoZSBzYW1lCisgIC8vIE9yaWdpbkNvbnRleHQgd2l0aGluIGEgUGFydGl0aW9uLgorCisgIGNvbnN0IHVybDo6T3JpZ2luIGtUZXN0T3JpZ2luID0KKyAgICAgIHVybDo6T3JpZ2luOjpDcmVhdGUoR1VSTCgiaHR0cDovL2V4YW1wbGUuY29tIikpOworICBtb2pvOjpSZW1vdGU8bW9qb206Ok9yaWdpbkNvbnRleHQ+IGNvbnRleHQxOworICByZW1vdGVfdGVzdF9wYXJ0aXRpb24oKS0+QmluZE9yaWdpbkNvbnRleHQoCisgICAgICBrVGVzdE9yaWdpbiwgY29udGV4dDEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGNvbnRleHQxLkZsdXNoRm9yVGVzdGluZygpOworICBFWFBFQ1RfRVEoMXUsIHRlc3RfcGFydGl0aW9uX2ltcGwoKS0+b3JpZ2luX2NvbnRleHRzKCkuc2l6ZSgpKTsKKworICBtb2pvOjpSZW1vdGU8bW9qb206Ok9yaWdpbkNvbnRleHQ+IGNvbnRleHQyOworICByZW1vdGVfdGVzdF9wYXJ0aXRpb24oKS0+QmluZE9yaWdpbkNvbnRleHQoCisgICAgICBrVGVzdE9yaWdpbiwgY29udGV4dDIuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGNvbnRleHQyLkZsdXNoRm9yVGVzdGluZygpOworICBFWFBFQ1RfRVEoMXUsIHRlc3RfcGFydGl0aW9uX2ltcGwoKS0+b3JpZ2luX2NvbnRleHRzKCkuc2l6ZSgpKTsKKworICBFWFBFQ1RfVFJVRShjb250ZXh0MS5pc19jb25uZWN0ZWQoKSk7CisgIEVYUEVDVF9UUlVFKGNvbnRleHQyLmlzX2Nvbm5lY3RlZCgpKTsKK30KKworVEVTVF9GKFN0b3JhZ2VTZXJ2aWNlUGFydGl0aW9uSW1wbFRlc3QsCisgICAgICAgT3JpZ2luQ29udGV4dERlc3Ryb3llZE9uTGFzdENsaWVudERpc2Nvbm5lY3QpIHsKKyAgY29uc3QgdXJsOjpPcmlnaW4ga1Rlc3RPcmlnaW4gPQorICAgICAgdXJsOjpPcmlnaW46OkNyZWF0ZShHVVJMKCJodHRwOi8vZXhhbXBsZS5jb20iKSk7CisgIG1vam86OlJlbW90ZTxtb2pvbTo6T3JpZ2luQ29udGV4dD4gY29udGV4dDE7CisgIHJlbW90ZV90ZXN0X3BhcnRpdGlvbigpLT5CaW5kT3JpZ2luQ29udGV4dCgKKyAgICAgIGtUZXN0T3JpZ2luLCBjb250ZXh0MS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgY29udGV4dDEuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpPcmlnaW5Db250ZXh0PiBjb250ZXh0MjsKKyAgcmVtb3RlX3Rlc3RfcGFydGl0aW9uKCktPkJpbmRPcmlnaW5Db250ZXh0KAorICAgICAga1Rlc3RPcmlnaW4sIGNvbnRleHQyLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworICBjb250ZXh0Mi5GbHVzaEZvclRlc3RpbmcoKTsKKworICBFWFBFQ1RfRVEoMXUsIHRlc3RfcGFydGl0aW9uX2ltcGwoKS0+b3JpZ2luX2NvbnRleHRzKCkuc2l6ZSgpKTsKKworICBjb250ZXh0MS5yZXNldCgpOworICBjb250ZXh0Mi5yZXNldCgpOworICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisKKyAgRVhQRUNUX0VRKDB1LCB0ZXN0X3BhcnRpdGlvbl9pbXBsKCktPm9yaWdpbl9jb250ZXh0cygpLnNpemUoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdG9yYWdlCmRpZmYgLS1naXQgYS9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL0JVSUxELmduIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9CVUlMRC5nbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRmZmIxCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9CVUlMRC5nbgpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCgiLy9tb2pvL3B1YmxpYy90b29scy9iaW5kaW5ncy9tb2pvbS5nbmkiKQorCittb2pvbSgibW9qb20iKSB7CisgIHNvdXJjZXMgPSBbCisgICAgIm9yaWdpbl9jb250ZXh0Lm1vam9tIiwKKyAgICAicGFydGl0aW9uLm1vam9tIiwKKyAgICAic3RvcmFnZV9zZXJ2aWNlLm1vam9tIiwKKyAgXQorCisgIHB1YmxpY19kZXBzID0gWworICAgICIvL21vam8vcHVibGljL21vam9tL2Jhc2UiLAorICAgICIvL3VybC9tb2pvbTp1cmxfbW9qb21fb3JpZ2luIiwKKyAgXQorfQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9PV05FUlMgYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODg1MGY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9PV05FUlMKQEAgLTAsMCArMSwyIEBACitwZXItZmlsZSAqLm1vam9tPXNldCBub3BhcmVudAorcGVyLWZpbGUgKi5tb2pvbT1maWxlOi8vaXBjL1NFQ1VSSVRZX09XTkVSUwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9vcmlnaW5fY29udGV4dC5tb2pvbSBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wdWJsaWMvbW9qb20vb3JpZ2luX2NvbnRleHQubW9qb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNGU3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL29yaWdpbl9jb250ZXh0Lm1vam9tCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbW9kdWxlIHN0b3JhZ2UubW9qb207CisKKy8vIEFuIE9yaWdpbkNvbnRleHQgZXhwb3NlcyB2YXJpb3VzIHN0b3JhZ2UgYmFja2VuZCBpbnRlcmZhY2VzIHNjb3BlZCB0byBhCisvLyBzaW5nbGUgc2VjdXJpdHkgb3JpZ2luIGFuZCBhIHNpbmdsZSBQYXJ0aXRpb24uIFNlZQorLy8gfFBhcnRpdGlvbi5CaW5kT3JpZ2luQ29udGV4dCgpfC4KKy8vCisvLyBJdCBpcyBzYWZlIGZvciB0aGUgYnJvd3NlciB0byBicm9rZXIgT3JpZ2luQ29udGV4dCBlbmRwb2ludHMgdG8gdGhlIFN0b3JhZ2UKKy8vIFNlcnZpY2UgaWYgdGhlIHJlbmRlcmVyIGlzIGtub3duIHRvIGJlIHJlbmRlcmluZyBjb250ZW50IGZyb20gdGhlIHJlbGV2YW50CisvLyBvcmlnaW4uCitpbnRlcmZhY2UgT3JpZ2luQ29udGV4dCB7fTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wdWJsaWMvbW9qb20vcGFydGl0aW9uLm1vam9tIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9wYXJ0aXRpb24ubW9qb20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU3ZTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wdWJsaWMvbW9qb20vcGFydGl0aW9uLm1vam9tCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworbW9kdWxlIHN0b3JhZ2UubW9qb207CisKK2ltcG9ydCAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9vcmlnaW5fY29udGV4dC5tb2pvbSI7CitpbXBvcnQgInVybC9tb2pvbS9vcmlnaW4ubW9qb20iOworCisvLyBQYXJ0aXRpb24gY29udHJvbHMgYW4gaXNvbGF0ZWQgc3RvcmFnZSBwYXJ0aXRpb24gb3duZWQgYnkgdGhlIFN0b3JhZ2UKKy8vIFNlcnZpY2UuIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBicm93c2VyJ3Mgb3duIHN0b3JhZ2UgcGFydGl0aW9uIGNvbmNlcHQuCitpbnRlcmZhY2UgUGFydGl0aW9uIHsKKyAgLy8gQmluZHMgYSBuZXcgT3JpZ2luQ29udGV4dCBzY29wZWQgdG8gfG9yaWdpbnwgd2l0aGluIHRoaXMgUGFydGl0aW9uLgorICBCaW5kT3JpZ2luQ29udGV4dCh1cmwubW9qb20uT3JpZ2luIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19yZWNlaXZlcjxPcmlnaW5Db250ZXh0PiByZWNlaXZlcik7Cit9OwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9zdG9yYWdlX3NlcnZpY2UubW9qb20gYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL3N0b3JhZ2Vfc2VydmljZS5tb2pvbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDE1Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9zdG9yYWdlX3NlcnZpY2UubW9qb20KQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTkgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCittb2R1bGUgc3RvcmFnZS5tb2pvbTsKKworaW1wb3J0ICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2UvcHVibGljL21vam9tL3BhcnRpdGlvbi5tb2pvbSI7CitpbXBvcnQgIm1vam8vcHVibGljL21vam9tL2Jhc2UvZmlsZV9wYXRoLm1vam9tIjsKKworLy8gVGhlIG1haW4gaW50ZXJmYWNlIGludG8gdGhlIFN0b3JhZ2UgU2VydmljZS4gVGhlIGJyb3dzZXIgbWFpbnRhaW5zIGEgc2luZ2xlCisvLyBnbG9iYWwgY29ubmVjdGlvbiB0byB0aGlzIGludGVyZmFjZS4KK2ludGVyZmFjZSBTdG9yYWdlU2VydmljZSB7CisgIC8vIEJpbmRzIGEgbmV3IFBhcnRpdGlvbiBlbmRwb2ludC4KKyAgLy8KKyAgLy8gfHBhdGh8IGlmIG5vbi1udWxsIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCwgYW5kIGl0IGlkZW50aWZpZXMgYSBwZXJzaXN0ZW50CisgIC8vIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGNvbnRyb2xsZWQgYnkgdGhlIHBhcnRpdGlvbi4gUGVyc2lzdGVudCBwYXJ0aXRpb25zCisgIC8vIHN1cHBvcnQgYXJiaXRyYXJpbHkgbWFueSBzaW11bHRhbmVvdXMgY2xpZW50cy4KKyAgLy8KKyAgLy8gSWYgfHBhdGh8IGlzIG51bGwsIHRoZSBib3VuZCBwYXJ0aXRpb24gZXhpc3RzIG9ubHkgaW4tbWVtb3J5IGFuZCBpcworICAvLyB1bmlxdWVseSBvd25lZCBieSBhIHNpbmdsZSBjbGllbnQuIERpc2Nvbm5lY3RpbmcgdGhlIFBhcnRpdGlvbiBjbGllbnQKKyAgLy8gZWZmZWN0aXZlbHkgZGVzdHJveXMgdGhlIHBhcnRpdGlvbiBhbmQgaXRzIGNvbnRlbnRzLgorICBCaW5kUGFydGl0aW9uKG1vam9fYmFzZS5tb2pvbS5GaWxlUGF0aD8gcGF0aCwKKyAgICAgICAgICAgICAgICBwZW5kaW5nX3JlY2VpdmVyPFBhcnRpdGlvbj4gcmVjZWl2ZXIpOworfTsKZGlmZiAtLWdpdCBhL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5jYyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjczODY3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5jYwpAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvc3RvcmFnZV9zZXJ2aWNlX2ltcGwuaCIKKworI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbC5oIgorCituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK1N0b3JhZ2VTZXJ2aWNlSW1wbDo6U3RvcmFnZVNlcnZpY2VJbXBsKAorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6U3RvcmFnZVNlcnZpY2U+IHJlY2VpdmVyKQorICAgIDogcmVjZWl2ZXJfKHRoaXMsIHN0ZDo6bW92ZShyZWNlaXZlcikpIHt9CisKK1N0b3JhZ2VTZXJ2aWNlSW1wbDo6flN0b3JhZ2VTZXJ2aWNlSW1wbCgpID0gZGVmYXVsdDsKKwordm9pZCBTdG9yYWdlU2VydmljZUltcGw6OkJpbmRQYXJ0aXRpb24oCisgICAgY29uc3QgYmFzZTo6T3B0aW9uYWw8YmFzZTo6RmlsZVBhdGg+JiBwYXRoLAorICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6UGFydGl0aW9uPiByZWNlaXZlcikgeworICBpZiAocGF0aC5oYXNfdmFsdWUoKSkgeworICAgIGlmICghcGF0aC0+SXNBYnNvbHV0ZSgpKSB7CisgICAgICAvLyBSZWZ1c2UgdG8gYmluZCBQYXJ0aXRpb25zIGZvciByZWxhdGl2ZSBwYXRocy4KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIGEgcGVyc2lzdGVudCBwYXJ0aXRpb24gdGhhdCBhbHJlYWR5IGV4aXN0cywgYmluZCB0byBpdCBhbmQKKyAgICAvLyB3ZSdyZSBkb25lLgorICAgIGF1dG8gaXRlciA9IHBlcnNpc3RlbnRfcGFydGl0aW9uX21hcF8uZmluZCgqcGF0aCk7CisgICAgaWYgKGl0ZXIgIT0gcGVyc2lzdGVudF9wYXJ0aXRpb25fbWFwXy5lbmQoKSkgeworICAgICAgaXRlci0+c2Vjb25kLT5CaW5kUmVjZWl2ZXIoc3RkOjptb3ZlKHJlY2VpdmVyKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgYXV0byBuZXdfcGFydGl0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxQYXJ0aXRpb25JbXBsPih0aGlzLCBwYXRoKTsKKyAgbmV3X3BhcnRpdGlvbi0+QmluZFJlY2VpdmVyKHN0ZDo6bW92ZShyZWNlaXZlcikpOworICBpZiAocGF0aC5oYXNfdmFsdWUoKSkKKyAgICBwZXJzaXN0ZW50X3BhcnRpdGlvbl9tYXBfWypwYXRoXSA9IG5ld19wYXJ0aXRpb24uZ2V0KCk7CisgIHBhcnRpdGlvbnNfLmluc2VydChzdGQ6Om1vdmUobmV3X3BhcnRpdGlvbikpOworfQorCit2b2lkIFN0b3JhZ2VTZXJ2aWNlSW1wbDo6UmVtb3ZlUGFydGl0aW9uKFBhcnRpdGlvbkltcGwqIHBhcnRpdGlvbikgeworICBpZiAocGFydGl0aW9uLT5wYXRoKCkuaGFzX3ZhbHVlKCkpCisgICAgcGVyc2lzdGVudF9wYXJ0aXRpb25fbWFwXy5lcmFzZShwYXJ0aXRpb24tPnBhdGgoKS52YWx1ZSgpKTsKKworICBhdXRvIGl0ZXIgPSBwYXJ0aXRpb25zXy5maW5kKHBhcnRpdGlvbik7CisgIGlmIChpdGVyICE9IHBhcnRpdGlvbnNfLmVuZCgpKQorICAgIHBhcnRpdGlvbnNfLmVyYXNlKGl0ZXIpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Vfc2VydmljZV9pbXBsLmggYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvc3RvcmFnZV9zZXJ2aWNlX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAxZjk0MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT01QT05FTlRTX1NFUlZJQ0VTX1NUT1JBR0VfU1RPUkFHRV9TRVJWSUNFX0lNUExfSF8KKyNkZWZpbmUgQ09NUE9ORU5UU19TRVJWSUNFU19TVE9SQUdFX1NUT1JBR0VfU0VSVklDRV9JTVBMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSAiYmFzZS9jb250YWluZXJzL3VuaXF1ZV9wdHJfYWRhcHRlcnMuaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVzL2ZpbGVfcGF0aC5oIgorI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3BhcnRpdGlvbl9pbXBsLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9zdG9yYWdlX3NlcnZpY2UubW9qb20uaCIKKyNpbmNsdWRlICJtb2pvL3B1YmxpYy9jcHAvYmluZGluZ3MvcGVuZGluZ19yZWNlaXZlci5oIgorI2luY2x1ZGUgIm1vam8vcHVibGljL2NwcC9iaW5kaW5ncy9yZWNlaXZlci5oIgorCituYW1lc3BhY2Ugc3RvcmFnZSB7CisKK2NsYXNzIFBhcnRpdGlvbkltcGw7CisKKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBtYWluIFN0b3JhZ2VTZXJ2aWNlIE1vam8gaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSByb290CisvLyBvd25lciBvZiBhbGwgU3RvcmFnZSBzZXJ2aWNlIGluc3RhbmNlIHN0YXRlLCBtYW5hZ2luZyB0aGUgc2V0IG9mIGFjdGl2ZQorLy8gcGVyc2lzdGVudCBhbmQgaW4tbWVtb3J5IHBhcnRpdGlvbnMuCitjbGFzcyBTdG9yYWdlU2VydmljZUltcGwgOiBwdWJsaWMgbW9qb206OlN0b3JhZ2VTZXJ2aWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFN0b3JhZ2VTZXJ2aWNlSW1wbCgKKyAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6U3RvcmFnZVNlcnZpY2U+IHJlY2VpdmVyKTsKKyAgflN0b3JhZ2VTZXJ2aWNlSW1wbCgpIG92ZXJyaWRlOworCisgIGNvbnN0IGF1dG8mIHBhcnRpdGlvbnMoKSBjb25zdCB7IHJldHVybiBwYXJ0aXRpb25zXzsgfQorCisgIC8vIG1vam9tOjpTdG9yYWdlU2VydmljZSBpbXBsZW1lbnRhdGlvbjoKKyAgdm9pZCBCaW5kUGFydGl0aW9uKGNvbnN0IGJhc2U6Ok9wdGlvbmFsPGJhc2U6OkZpbGVQYXRoPiYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1vam86OlBlbmRpbmdSZWNlaXZlcjxtb2pvbTo6UGFydGl0aW9uPiByZWNlaXZlcikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgUGFydGl0aW9uSW1wbDsKKworICAvLyBSZW1vdmVzIGEgcGFydGl0aW9uIGZyb20gdGhlIHNldCBvZiB0cmFja2VkIHBhcnRpdGlvbnMuCisgIHZvaWQgUmVtb3ZlUGFydGl0aW9uKFBhcnRpdGlvbkltcGwqIHBhcnRpdGlvbik7CisKKyAgY29uc3QgbW9qbzo6UmVjZWl2ZXI8bW9qb206OlN0b3JhZ2VTZXJ2aWNlPiByZWNlaXZlcl87CisKKyAgLy8gVGhlIHNldCBvZiBhbGwgaXNvbGF0ZWQgcGFydGl0aW9ucyBvd25lZCBieSB0aGUgc2VydmljZS4gVGhpcyBpbmNsdWRlcyBib3RoCisgIC8vIHBlcnNpc3RlbnQgYW5kIGluLW1lbW9yeSBwYXJ0aXRpb25zLgorICBzdGQ6OnNldDxzdGQ6OnVuaXF1ZV9wdHI8UGFydGl0aW9uSW1wbD4sIGJhc2U6OlVuaXF1ZVB0ckNvbXBhcmF0b3I+CisgICAgICBwYXJ0aXRpb25zXzsKKworICAvLyBBIG1hcHBpbmcgZnJvbSBGaWxlUGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBQYXJ0aXRpb25JbXBsIGluc3RhbmNlIGluCisgIC8vIHxwYXJ0aXRpb25zX3wuIFRoZSBwb2ludGVycyBzdG9yZWQgaGVyZSBhcmUgbm90IG93bmVkIGJ5IHRoaXMgbWFwIGFuZCBtdXN0CisgIC8vIGJlIHJlbW92ZWQgd2hlbiByZW1vdmVkIGZyb20gfHBhcnRpdGlvbnNffC4gT25seSBwZXJzaXN0ZW50IHBhcnRpdGlvbnMgaGF2ZQorICAvLyBlbnRyaWVzIGluIHRoaXMgbWFwLgorICBzdGQ6Om1hcDxiYXNlOjpGaWxlUGF0aCwgUGFydGl0aW9uSW1wbCo+IHBlcnNpc3RlbnRfcGFydGl0aW9uX21hcF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0b3JhZ2VTZXJ2aWNlSW1wbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQorCisjZW5kaWYgIC8vIENPTVBPTkVOVFNfU0VSVklDRVNfU1RPUkFHRV9TVE9SQUdFX1NFUlZJQ0VfSU1QTF9IXwpkaWZmIC0tZ2l0IGEvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Vfc2VydmljZV9pbXBsX3VuaXR0ZXN0LmNjIGIvY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3N0b3JhZ2Vfc2VydmljZV9pbXBsX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzU3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wb25lbnRzL3NlcnZpY2VzL3N0b3JhZ2Uvc3RvcmFnZV9zZXJ2aWNlX2ltcGxfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMzIgQEAKKy8vIENvcHlyaWdodCAyMDE5IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9zdG9yYWdlX3NlcnZpY2VfaW1wbC5oIgorCisjaW5jbHVkZSAiYmFzZS9maWxlcy9maWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVzL3Njb3BlZF90ZW1wX2Rpci5oIgorI2luY2x1ZGUgImJhc2UvbWFjcm9zLmgiCisjaW5jbHVkZSAiYmFzZS9ydW5fbG9vcC5oIgorI2luY2x1ZGUgImJhc2UvdGVzdC9zY29wZWRfdGFza19lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wYXJ0aXRpb25faW1wbC5oIgorI2luY2x1ZGUgImNvbXBvbmVudHMvc2VydmljZXMvc3RvcmFnZS9wdWJsaWMvbW9qb20vcGFydGl0aW9uLm1vam9tLmgiCisjaW5jbHVkZSAiY29tcG9uZW50cy9zZXJ2aWNlcy9zdG9yYWdlL3B1YmxpYy9tb2pvbS9zdG9yYWdlX3NlcnZpY2UubW9qb20uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHN0b3JhZ2UgeworCitjbGFzcyBTdG9yYWdlU2VydmljZUltcGxUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgU3RvcmFnZVNlcnZpY2VJbXBsVGVzdCgpID0gZGVmYXVsdDsKKyAgflN0b3JhZ2VTZXJ2aWNlSW1wbFRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyBwcm90ZWN0ZWQ6CisgIG1vam9tOjpTdG9yYWdlU2VydmljZSogcmVtb3RlX3NlcnZpY2UoKSB7IHJldHVybiByZW1vdGVfc2VydmljZV8uZ2V0KCk7IH0KKyAgU3RvcmFnZVNlcnZpY2VJbXBsJiBzZXJ2aWNlX2ltcGwoKSB7IHJldHVybiBzZXJ2aWNlXzsgfQorCisgcHJpdmF0ZToKKyAgYmFzZTo6dGVzdDo6U2NvcGVkVGFza0Vudmlyb25tZW50IHRhc2tfZW52aXJvbm1lbnRfOworICBtb2pvOjpSZW1vdGU8bW9qb206OlN0b3JhZ2VTZXJ2aWNlPiByZW1vdGVfc2VydmljZV87CisgIFN0b3JhZ2VTZXJ2aWNlSW1wbCBzZXJ2aWNlX3tyZW1vdGVfc2VydmljZV8uQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKX07CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0b3JhZ2VTZXJ2aWNlSW1wbFRlc3QpOworfTsKKworVEVTVF9GKFN0b3JhZ2VTZXJ2aWNlSW1wbFRlc3QsIFVuaXF1ZUluTWVtb3J5UGFydGl0aW9ucykgeworICAvLyBWZXJpZmllcyB0aGF0IGV2ZXJ5IHBhcnRpdGlvbiBjbGllbnQgYm91bmQgd2l0aG91dCBhIHBhdGggaXMgYm91bmQgdG8gYQorICAvLyB1bmlxdWUgcGFydGl0aW9uIGluc3RhbmNlLgorCisgIG1vam86OlJlbW90ZTxtb2pvbTo6UGFydGl0aW9uPiBpbl9tZW1vcnlfcGFydGl0aW9uMTsKKyAgcmVtb3RlX3NlcnZpY2UoKS0+QmluZFBhcnRpdGlvbigKKyAgICAgIC8qcGF0aD0qL2Jhc2U6Om51bGxvcHQsCisgICAgICBpbl9tZW1vcnlfcGFydGl0aW9uMS5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgaW5fbWVtb3J5X3BhcnRpdGlvbjEuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgRVhQRUNUX0VRKDF1LCBzZXJ2aWNlX2ltcGwoKS5wYXJ0aXRpb25zKCkuc2l6ZSgpKTsKKworICBtb2pvOjpSZW1vdGU8bW9qb206OlBhcnRpdGlvbj4gaW5fbWVtb3J5X3BhcnRpdGlvbjI7CisgIHJlbW90ZV9zZXJ2aWNlKCktPkJpbmRQYXJ0aXRpb24oCisgICAgICBiYXNlOjpudWxsb3B0IC8qIHBhdGggKi8sCisgICAgICBpbl9tZW1vcnlfcGFydGl0aW9uMi5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgaW5fbWVtb3J5X3BhcnRpdGlvbjIuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgRVhQRUNUX0VRKDJ1LCBzZXJ2aWNlX2ltcGwoKS5wYXJ0aXRpb25zKCkuc2l6ZSgpKTsKKworICAvLyBBbHNvIHZlcmlmeSB0aGF0IGEgbmV3IGNsaWVudCB3aXRoIGEgcHJvdmlkZWQgcGF0aCBpcyB1bmlxdWUgZnJvbSB0aGUgYWJvdmUKKyAgLy8gcGFydGl0aW9ucy4KKyAgYmFzZTo6U2NvcGVkVGVtcERpciB0ZW1wX2RpcjsKKyAgQ0hFQ0sodGVtcF9kaXIuQ3JlYXRlVW5pcXVlVGVtcERpcigpKTsKKworICBtb2pvOjpSZW1vdGU8bW9qb206OlBhcnRpdGlvbj4gcGVyc2lzdGVudF9wYXJ0aXRpb247CisgIHJlbW90ZV9zZXJ2aWNlKCktPkJpbmRQYXJ0aXRpb24oCisgICAgICB0ZW1wX2Rpci5HZXRQYXRoKCksIHBlcnNpc3RlbnRfcGFydGl0aW9uLkJpbmROZXdQaXBlQW5kUGFzc1JlY2VpdmVyKCkpOworICBwZXJzaXN0ZW50X3BhcnRpdGlvbi5GbHVzaEZvclRlc3RpbmcoKTsKKworICBFWFBFQ1RfRVEoM3UsIHNlcnZpY2VfaW1wbCgpLnBhcnRpdGlvbnMoKS5zaXplKCkpOworfQorCitURVNUX0YoU3RvcmFnZVNlcnZpY2VJbXBsVGVzdCwgU2hhcmVkUGVyc2lzdGVudFBhcnRpdGlvbikgeworICAvLyBWZXJpZmllcyB0aGF0IG11bHRpcGxlIGNsaWVudHMgY2FuIHNoYXJlIHRoZSBzYW1lIHBlcnNpc3RlbnQgcGFydGl0aW9uCisgIC8vIGluc3RhbmNlLgorCisgIGJhc2U6OlNjb3BlZFRlbXBEaXIgdGVtcF9kaXI7CisgIENIRUNLKHRlbXBfZGlyLkNyZWF0ZVVuaXF1ZVRlbXBEaXIoKSk7CisKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpQYXJ0aXRpb24+IGNsaWVudDE7CisgIHJlbW90ZV9zZXJ2aWNlKCktPkJpbmRQYXJ0aXRpb24odGVtcF9kaXIuR2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudDEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGNsaWVudDEuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgRVhQRUNUX0VRKDF1LCBzZXJ2aWNlX2ltcGwoKS5wYXJ0aXRpb25zKCkuc2l6ZSgpKTsKKworICBtb2pvOjpSZW1vdGU8bW9qb206OlBhcnRpdGlvbj4gY2xpZW50MjsKKyAgcmVtb3RlX3NlcnZpY2UoKS0+QmluZFBhcnRpdGlvbih0ZW1wX2Rpci5HZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50Mi5CaW5kTmV3UGlwZUFuZFBhc3NSZWNlaXZlcigpKTsKKyAgY2xpZW50Mi5GbHVzaEZvclRlc3RpbmcoKTsKKworICBFWFBFQ1RfRVEoMXUsIHNlcnZpY2VfaW1wbCgpLnBhcnRpdGlvbnMoKS5zaXplKCkpOworICBFWFBFQ1RfVFJVRShjbGllbnQxLmlzX2Nvbm5lY3RlZCgpKTsKKyAgRVhQRUNUX1RSVUUoY2xpZW50Mi5pc19jb25uZWN0ZWQoKSk7Cit9CisKK1RFU1RfRihTdG9yYWdlU2VydmljZUltcGxUZXN0LCBQYXJ0aXRpb25EZXN0cm95ZWRPbkxhc3RDbGllbnREaXNjb25uZWN0KSB7CisgIGJhc2U6OlNjb3BlZFRlbXBEaXIgdGVtcF9kaXI7CisgIENIRUNLKHRlbXBfZGlyLkNyZWF0ZVVuaXF1ZVRlbXBEaXIoKSk7CisKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpQYXJ0aXRpb24+IGNsaWVudDE7CisgIHJlbW90ZV9zZXJ2aWNlKCktPkJpbmRQYXJ0aXRpb24odGVtcF9kaXIuR2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudDEuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGNsaWVudDEuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgbW9qbzo6UmVtb3RlPG1vam9tOjpQYXJ0aXRpb24+IGNsaWVudDI7CisgIHJlbW90ZV9zZXJ2aWNlKCktPkJpbmRQYXJ0aXRpb24odGVtcF9kaXIuR2V0UGF0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudDIuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisgIGNsaWVudDIuRmx1c2hGb3JUZXN0aW5nKCk7CisKKyAgRVhQRUNUX0VRKDF1LCBzZXJ2aWNlX2ltcGwoKS5wYXJ0aXRpb25zKCkuc2l6ZSgpKTsKKworICBjbGllbnQxLnJlc2V0KCk7CisgIGNsaWVudDIucmVzZXQoKTsKKworICBiYXNlOjpSdW5Mb29wKCkuUnVuVW50aWxJZGxlKCk7CisKKyAgRVhQRUNUX0VRKDB1LCBzZXJ2aWNlX2ltcGwoKS5wYXJ0aXRpb25zKCkuc2l6ZSgpKTsKK30KKworVEVTVF9GKFN0b3JhZ2VTZXJ2aWNlSW1wbFRlc3QsIFBlcnNpc3RlbnRQYXJ0aXRpb25SZXF1aXJlc0Fic29sdXRlUGF0aCkgeworICBtb2pvOjpSZW1vdGU8bW9qb206OlBhcnRpdGlvbj4gY2xpZW50OworICBjb25zdCBiYXNlOjpGaWxlUGF0aCBrVGVzdFJlbGF0aXZlUGF0aHtGSUxFX1BBVEhfTElURVJBTCgiaW52YWxpZCIpfTsKKyAgcmVtb3RlX3NlcnZpY2UoKS0+QmluZFBhcnRpdGlvbihrVGVzdFJlbGF0aXZlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuQmluZE5ld1BpcGVBbmRQYXNzUmVjZWl2ZXIoKSk7CisKKyAgLy8gV2Ugc2hvdWxkIGJlIGltbWluZW50bHkgZGlzY29ubmVjdGVkIGJlY2F1c2UgdGhlIEJpbmRQYXJ0aXRpb24gcmVxdWVzdAorICAvLyBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgc2VydmljZS4KKyAgYmFzZTo6UnVuTG9vcCBsb29wOworICBjbGllbnQuc2V0X2Rpc2Nvbm5lY3RfaGFuZGxlcihsb29wLlF1aXRDbG9zdXJlKCkpOworICBsb29wLlJ1bigpOworCisgIEVYUEVDVF9GQUxTRShjbGllbnQuaXNfY29ubmVjdGVkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3RvcmFnZQo=